#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include <time.h>

#include "constantes.h"
#include "donnees.h"
#include "fonction.h"
#include "graphique.h"


void saisie(GtkButton *button)
{
    GtkWidget *selection;
    selection = gtk_file_selection_new( g_locale_to_utf8( "Sélectionnez un fichier", -1, NULL, NULL, NULL) );
    gtk_widget_show(selection);
    g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(selection)->ok_button), "clicked", G_CALLBACK(importation), selection );
    g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(selection)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), selection);
}

/*
 * Lit les donnees a partir d'un fichier CSV et les affiches dans le tableau des etudiants.
 * Calcul et cree les groupes et les binomes.
 * Affiche les 
 */
void importation(GtkWidget *bouton, GtkWidget *file_selection, gchar* chemin)
{
	int i;
	gchar *NOM;
	gchar *PRENOM;
	gchar *ORIGINE;
	gchar *LOGIN;
	FILE* excel=NULL;
	GtkWidget *selection;

	//Etudiant * tab_stpi = NULL;
	//Etudiant * tab_externe = NULL;
	//Etudiant * groupe_A =  NULL;
	//Etudiant * groupe_B = NULL;
	//Etudiant * tab_binome_groupe_A=NULL;
	//Etudiant * tab_binome_groupe_B=NULL;

	int stpi;
	int externe;
	int Nb_groupe_A;
	int Nb_groupe_B;
	int Nb_binomes_B;
	int Nb_binomes_A;
	int Nb_etudiants;

	//Etudiant * promo = NULL; //la declaration de ce tableau d'etudiant a ete remis dans constante.h
							   //car il doit etre utilise dans la fonction promo2()

	PRENOM			 = g_malloc(12);
	NOM				 = g_malloc(12);
	ORIGINE			 = g_malloc(12);
	LOGIN			 = g_malloc(12);

	selection = gtk_file_selection_new( g_locale_to_utf8( "Sélectionnez un fichier", -1, NULL, NULL, NULL) );
	chemin = gtk_file_selection_get_filename(GTK_FILE_SELECTION (file_selection) );
	excel = fopen(chemin,"rt");
	printf(chemin);
	//Est ce que le fichier n a pas ete ouvert en lecture ?
	if (excel == NULL)
	{
		GtkWidget *dialog;
		dialog = gtk_message_dialog_new(GTK_WINDOW(file_selection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Impossible d'ouvrir le fichier : \n%s", g_locale_to_utf8(chemin, -1, NULL, NULL, NULL));
		gtk_dialog_run(GTK_DIALOG(dialog));
		gtk_widget_destroy(dialog);
		gtk_widget_destroy(file_selection);
		return;
	}
	else
	{
		Nb_etudiants= Nombredelignes(excel);
		promo =(Etudiant*)g_malloc (sizeof(Etudiant)*Nb_etudiants); //allocation mémoire pour le tableau structure représentant le CSV
		ExtractionCSV(excel, Nb_etudiants,promo);
		for(i = 0 ; i < Nb_etudiants ; ++i)
		{
			GtkTreeIter pIter;
			sprintf(NOM, "%s", promo[i].nom);
			sprintf(PRENOM, "%s", promo[i].prenom);
			sprintf(ORIGINE, "%s", promo[i].origine);
			sprintf(LOGIN, "%s", promo[i].login);
			/* Creation de la nouvelle ligne */
			gtk_list_store_append(pListStore, &pIter);
			/* Mise a jour des donnees */
			gtk_list_store_set(pListStore, &pIter,COLONNE_NOM, NOM,COLONNE_PRENOM, PRENOM,COLONNE_ORIGINE,ORIGINE, COLONNE_LOGIN, LOGIN,-1);
		}
	}

	//on detruit la fenetre de dialogue pour la selection des fichiers
	gtk_widget_destroy(file_selection);

	//
	//calcul des donnees pour la creation des groupes et des binomes.
	//

	//calcul de nombres d'etudiants STPI et externes
	stpi    = comptage_stpi(promo, Nb_etudiants);
	externe = comptage_externe(stpi, Nb_etudiants);

	//nb etu groupe A
	Nb_groupe_A  = (stpi/2)+(externe/2);
	Nb_binomes_A = Nb_binome_groupe(Nb_groupe_A);

	//nb etu groupe B
	Nb_groupe_B  = Nb_etudiants - Nb_groupe_A;
	Nb_binomes_B = Nb_binome_groupe(Nb_groupe_B);

	tab_stpi    =(Etudiant*)malloc (sizeof(Etudiant)*stpi);		//allocation memoire pour le tableau structure représentant les stpi
	tab_externe =(Etudiant*)malloc (sizeof(Etudiant)*externe);  //allocation memoire pour le tableau structure représentant les externes

	groupe_A =(Etudiant*)malloc (sizeof(Etudiant)*Nb_groupe_A); //allocation memoire pour le tableau structure représentant le CSV
	groupe_B =(Etudiant*)malloc (sizeof(Etudiant)*Nb_groupe_B); //allocation memoire pour le tableau structure représentant le CSV

	tab_binome_groupe_A = (Binome*)malloc (sizeof(Binome)*Nb_binomes_A);
	tab_binome_groupe_B = (Binome*)malloc (sizeof(Binome)*Nb_binomes_B);

	repartition_stpi_externe(promo,tab_stpi,tab_externe,Nb_etudiants);

	creation_groupe(promo, tab_stpi,tab_externe,stpi,externe,groupe_A,groupe_B,Nb_groupe_A,Nb_groupe_B);

	creation_binome(tab_binome_groupe_A,groupe_A,Nb_groupe_A,Nb_binomes_A);  // on teste d'abord pour le groupe A et on fait copier coller pour le groupe B
	creation_binome(tab_binome_groupe_B,groupe_B,Nb_groupe_B,Nb_binomes_B);  // on teste d'abord pour le groupe A et on fait copier coller pour le groupe B

	for(i = 0 ; i < Nb_groupe_A ; ++i)
	{
		GtkTreeIter pIter2;
		sprintf(NOM, "%s", groupe_A[i].nom);
		sprintf(PRENOM, "%s", groupe_A[i].prenom);
		//Creation de la nouvelle ligne
		gtk_list_store_append(pListStore2, &pIter2);
		//Mise a jour des donnees
		gtk_list_store_set(pListStore2, &pIter2,COLONNE_NOM2, NOM,COLONNE_PRENOM2, PRENOM,-1);
	}

	//Attention cette fonction a ete libere la memoire alloue au tableau promo.
	//or ce tabkleau sera reutilise plus trad dans la fonction promo2 !
	//donc verfier ce qui doit etre liberer par cette fonction de ce qui ne devrait pas l'etre.
	liberation_alloc_tab(promo, tab_stpi, tab_externe, groupe_A, groupe_B, tab_binome_groupe_A, tab_binome_groupe_B);

	g_free(PRENOM);
	g_free(NOM);
	g_free(ORIGINE);
	g_free(LOGIN);
	fclose(excel);
}

void afficherTableau1(GtkWidget * Hbox,GtkWidget * vbox1)
{
    GtkWidget *pListView;
    GtkWidget *pScrollbar;
    GtkTreeViewColumn *pColumn;
    GtkCellRenderer *pCellRenderer;
    /* Creation du modele */
    pListStore = gtk_list_store_new(N_COLUMN,  G_TYPE_STRING,  G_TYPE_STRING, G_TYPE_STRING,G_TYPE_STRING);

    /* Creation de la vue */
    pListView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pListStore));

    /* Creation de la premiere colonne */
    pCellRenderer = gtk_cell_renderer_text_new();
    pColumn = gtk_tree_view_column_new_with_attributes("Nom", pCellRenderer, "text", COLONNE_NOM, NULL);

    /* Ajout de la colonne à la vue */
    gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);

    /* Creation de la deuxieme colonne */
    pCellRenderer = gtk_cell_renderer_text_new();
    pColumn = gtk_tree_view_column_new_with_attributes("Prenom",pCellRenderer, "text", COLONNE_PRENOM,NULL);

    /* Ajout de la colonne à la vue */
    gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);

    /* Creation de la 3eme colonne */
    pCellRenderer = gtk_cell_renderer_text_new();
    pColumn = gtk_tree_view_column_new_with_attributes("Origine",pCellRenderer, "text", COLONNE_ORIGINE,NULL);

    /* Ajout de la colonne à la vue */
    gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);

   /* Creation de la 4eme colonne */
    pCellRenderer = gtk_cell_renderer_text_new();
    pColumn = gtk_tree_view_column_new_with_attributes("Login",pCellRenderer, "text", COLONNE_LOGIN,NULL);

     /* Ajout de la colonne à la vue */
    gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);

    /* Ajout de la vue a la fenetre */
    pScrollbar = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScrollbar),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);

    /* on ajoute le tableau dansla boite de la Scrollbar */
    gtk_container_add(GTK_CONTAINER(pScrollbar), pListView);

    /*on ajout la scrolbar dans la vb1 */
    gtk_container_add(GTK_CONTAINER(vbox1), pScrollbar);
}

void afficherTableau2(GtkWidget * Hbox,GtkWidget * vbox1)
{
    GtkWidget *pListView2;
    GtkWidget *pScrollbar2;
    GtkTreeViewColumn *pColumn;
    GtkCellRenderer *pCellRenderer;
    pListStore2 = gtk_list_store_new(N_COLUMN2,  G_TYPE_STRING,  G_TYPE_STRING);

    /* Creation de la vue */
    pListView2 = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pListStore2));

    /* Creation de la premiere colonne */
    pCellRenderer = gtk_cell_renderer_text_new();
    pColumn = gtk_tree_view_column_new_with_attributes("Nom", pCellRenderer, "text", COLONNE_NOM2, NULL);

    /* Ajout de la colonne à la vue */
    gtk_tree_view_append_column(GTK_TREE_VIEW(pListView2), pColumn);

    /* Creation de la deuxieme colonne */
    pCellRenderer = gtk_cell_renderer_text_new();
    pColumn = gtk_tree_view_column_new_with_attributes("Prenom",pCellRenderer, "text", COLONNE_PRENOM2,NULL);

    /* Ajout de la colonne à la vue */
    gtk_tree_view_append_column(GTK_TREE_VIEW(pListView2), pColumn);

    /* Ajout de la vue a la fenetre */
    pScrollbar2 = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScrollbar2),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);

    /* on ajoute le tableau dansla boite de la Scrollbar */
    gtk_container_add(GTK_CONTAINER(pScrollbar2), pListView2);

    /*on ajout la scrolbar dans la vb1 */
    gtk_container_add(GTK_CONTAINER(vbox1), pScrollbar2);

}

/*
 * Affiche la liste de la promo.
 */
void promo2(GtkWidget *widget, gpointer data)
{
	int i;
	GtkTreeIter pIter2;

	gchar * NOM;
	gchar * PRENOM;
	PRENOM	= g_malloc(12);
	NOM		= g_malloc(12);
		
	// NOUS VOULONS AFFICHER LE TABLEAU DE LA PROMO
	for(i = 0 ; i < 10 ; i++)
	{
		
		sprintf(NOM, "%s", promo[i].nom);
		sprintf(PRENOM, "%s", promo[i].prenom);
		//Creation de la nouvelle ligne
		gtk_list_store_append(pListStore2, &pIter2);
		
		// Mise a jour des donnees
		gtk_list_store_set(pListStore2, &pIter2,COLONNE_NOM2, NOM,COLONNE_PRENOM2, PRENOM,-1);
	}

	g_free(PRENOM);
	g_free(NOM);
}
